% parser + generador de formulas + generador codigo especifico
% consola, pipeline
% bison+flex / entrada SQL
% SQL92
% representación propia restricciones
% salida formato insert SQL
% c++
% gecode ---> MiniZinc
En esta sección se exponen las decisiones más relevantes que se tomaron en el diseño de la herramienta. Estas decisiones guiaron el desarrollo, dotándole de una arquitectura y acotando las tecnologías que se usarían para ello.

\begin{itemize}
\item\emph{Pipeline}

El prototipo se diseño en forma de \textit{pipeline} (ver sección \ref{sec:pipeline}), es decir, se dividió en módulos funcionales de forma que la salida de un módulo es la entrada del siguiente. Los principales módulos identificados son el analizador sintáctico o parser, el generador de fórmulas y el traductor a código de programación con restricciones o de resolutor específico. Esto nos facilita la depuración y las pruebas a la par que refuerza la modularidad del proyecto. Permitiendo la reutilización y sustitución de módulos así como la ampliación de las posibilidades de la herramienta, realizando diferentes implementaciones para cada unidad funcional del proyecto.

\item\emph{Resolutor}

En una fase inicial se decidió utilizar Gecode \cite{Gecode} como resolutor de las restricciones generadas. Posteriormente se cambió la decisión por MiniZinc\cite{MiniZinc}, un lenguaje con mayor nivel de abstracción que facilitó el desarrollo y que permite la elección del resolutor a utilizar.

\item \emph{Restricciones}

Utilizamos una representación interna de las restricciones, lo que nos permite implementar módulos que las traduzcan a distintos lenguajes y resolutores. 

\item\emph{Parser}

El analizador sintáctico estudia el código de definición de la base de datos y genera la representación de la misma. Nos basamos en la gramática de SQL-92 propuesta en \cite{sql92} para implementarlo. Se decidió usar Flex \cite{Flex} y Bison \cite{bison} como analizadores léxicos y sintácticos respectivamente. 

\item\emph{Lenguaje de programación}

El lenguaje de programación utilizado es C++. Esta decisión estuvo influenciada por la elección de Gecode como resolutor ya que éste es una librería de C++. Además, el equipo de desarrollo estaba familiarizado con el lenguaje.

\item\emph{Salida de datos}

Presentamos el caso de prueba encontrado como sentencias de inserción SQL, esto facilita la comprensión y la inclusión directa de los resultados en la base de datos.

\end{itemize}